import axios from 'axios'

// 购物车模块
const cartModule = {
  namespaced: true,
  // state需要写成函数，返回一个数据对象，跟组件中 data函数 一样
  state(){
    return {
      goodsList: []
    }
  },
  mutations: {
    setGoodsList(state, newList){
      state.goodsList = newList
    },
    // 设置 指定对象 的 状态，让它的状态 与 小选 复选框的状态 保持一致
    /*
    因为mutations只能接受两个参数，由于这里需要两个参数信息，一个是下标，另一个是状态
    所以这里第二个参数写成一个对象，对象中可以包含多个属性，可以传入参数
    */
    setGoodsItemState(state, obj) {
      state.goodsList[obj.index].goods_state = obj.checked
    },
    setGoodsListState(state, checked){
      state.goodsList.forEach(obj => obj.goods_state = checked)
    }
  },
  actions: {
    async asyncSetGoodsList(store) {
      // 步骤：
      // 1、 发起ajax请求
      const resp = await axios({
        method: 'GET',
        url: 'https://www.escook.cn/api/cart'
      })
      // 2、 后台响应的数据 commit到 setGoodsList mutations中
      store.commit('setGoodsList', resp.data.list)
    }
  },
  getters: {
    // 总价格
    totalCount(state){
      return state.goodsList.reduce((sum, obj) => {
        if(obj.goods_state) {
          sum += obj.goods_count
        }
        return sum
      }, 0)
    },
    // 总数量
    totalPrice(state){
      return state.goodsList.reduce((sum, obj) => {
        if(obj.goods_state) {
          sum += obj.goods_count * obj.goods_price
        }
        return sum
      }, 0)
    },

    isAllChecked(state){
      return state.goodsList.every(obj => obj.goods_state)
      /*
      return state.goodsList.every(function(obj){
        return obj.goods_state
      })
      */
    }
  },
}

export default cartModule

